﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using TCC_Hotel.Entidades;
using TCC_Hotel.Repositorio;
using System.Web.Caching;

namespace TCC_Hotel.Serviços.BDServices
{
    public class LoginService
    {
        FuncionarioService servico_Funcionario = new FuncionarioService();
        LoginRepositorio repositorio = new LoginRepositorio();

        /// <summary>
        /// Verifica se o usuario e a senha são validos
        /// </summary>
        /// <param name="apartamento">usuario</param>
        /// <param name="numero">senha</param>
        /// <returns>retorna true se é valido ou false se não</returns>
        public bool VerificarLogin(string Usuario, string senha)
        {
            Funcionario funcionario = servico_Funcionario.RecuperarDetalhesFuncionarioAtivoPorUsuario(Usuario);

            if (funcionario == null)
                return false;

            if (funcionario.Senha == senha)
                return true;
            else
                return false;
        }

        /// <summary>
        /// Serviço para listar todos as permissoes do banco
        /// </summary>
        /// <returns>Lista com as permissoes do banco</returns>
        public List<Permissao> RecuperarPermissoes()
        {
            return repositorio.RecuperarPermissoes();

        }

        /// <summary>
        /// Serviço para editar as permissoes de um usuario
        /// </summary>
        /// <returns>true se eidtou ou false se nao</returns>
        public bool EditarPermissoes(Permissao Permissao)
        {
            return repositorio.EditarPermissoes(Permissao);

        }

        /// <summary>
        /// Serviço para recuperar uma permissao do cache
        /// </summary>
        /// <returns>permissao do banco</returns>
        public Permissao RecuperarPermissaoCache(string Usuario)
        {
            return ListarPermissoesCache().Where(i=>i.Usuario == Usuario).FirstOrDefault();

        }

        /// <summary>
        /// Serviço para trocar senha do usuario
        /// </summary>
        /// <returns>true se trocou ou false se não</returns>
        public bool TrocarSenhaUsuario(string Usuario, string NovaSenha)
        {
            return servico_Funcionario.TrocarSenhaFuncionario(Usuario, NovaSenha);

        }

        /// <summary>
        /// Verifica se a informação ja esta gravada em cache, se tiver recupera, 
        /// senao faz a consulta e grava em cache
        /// </summary>
        /// <returns>Lista de permissoes</returns>
        public List<Permissao> ListarPermissoesCache()
        {
            List<Permissao> Permissoes = new List<Permissao>();

            //Verifica se a informação esta guardada em cache
            if (HttpContext.Current.Cache.Get("Lista_Permissao") == null)
            {
                //Consulta os funcionarios no banco
                Permissoes = RecuperarPermissoes();

                //Armazena a lista de funcionario em cache de 1 minuto para evitar muitas consultas ao banco
                HttpContext.Current.Cache.Add("Lista_Permissao", Permissoes, null,
                                 DateTime.Now.AddMinutes(5), Cache.NoSlidingExpiration, CacheItemPriority.High, null);

            }

           //caso essa informaçao ja estiver no cache
            else
            { 
                //Resgata informação do cache
                Permissoes = (List<Permissao>)HttpContext.Current.Cache.Get("Lista_Permissao");

            }

            return Permissoes;
        }
    }
}